package pessoas.presenter;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JOptionPane;
import pessoas.collection.Contatos;
import pessoas.collection.Operadoras;
import pessoas.dataHora.DataHora;
import pessoas.model.Contato;
import pessoas.model.Usuario;
import pessoas.presenter.stateContatoView.EdicaoState;
import pessoas.presenter.stateContatoView.InclusaoState;
import pessoas.presenter.stateContatoView.ManterContatoState;
import pessoas.presenter.stateContatoView.VisualizacaoState;
import pessoas.view.ContatoView;

public final class ContatoPresenter extends framework.FrameworkAbstrato{

    Contatos contatos;
    private ContatoView view;
    private Contato contato;
    private Operadoras operadoras;
    private Usuario usuario;
    private DataHora dataHora;
    protected ManterContatoState contatoState;

    public ContatoPresenter(Usuario usuario, Contatos contatos, Contato contato, boolean flag) {

        this.contatos = contatos;
        view = new ContatoView(null, true);
        this.contato = contato;
        this.usuario = usuario;
        dataHora = new DataHora();
        try {
            this.operadoras = Operadoras.getInstancia();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(view, ex.getMessage());
        }

        view.getComboOper().setEnabled(false);
        view.getComboUf().setEnabled(false);

        view.getTxtTelefone().addKeyListener(new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent e) {
                atualizaUFOperadoras();
            }
        });

        if (contato != null) {
            funcaoBtnSalvarEditar(true);
            funcaoBtnFecharCancelar(true);
            if (flag == true) { //verifica estado se é para editar ou visualizar
                contatoState = new VisualizacaoState(this, contato);
            } else {
                contatoState = new EdicaoState(this, contato);
            }
        } else {
            funcaoBtnSalvarEditar(false);
            funcaoBtnFecharCancelar(true);
            contatoState = new InclusaoState(this, contato);
        }

        view.getBtnNovo().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                btnNovoContato();
            }
        });

        view.setLocationRelativeTo(view);
        view.setVisible(true);
    }

    public void setEstado(ManterContatoState estado) {
        contatoState = estado;
    }

    public ContatoView getView() {
        return view;
    }

    public void atualizaUFOperadoras() {
        String tel = view.getTxtTelefone().getText().substring(1, 3) + view.getTxtTelefone().getText().substring(4);
        tel = tel.replace(" ", "").replace("-", "");
        if (tel.length() == 10) {
            try {
                String nome = view.getTxtNome().getText();
                String sobrenome = view.getTxtSobrenome().getText();
                String telefone = view.getTxtTelefone().getText();
                Contato contato = new Contato(nome, sobrenome, telefone, null, null);
                contato = operadoras.detectaUfOperadora(contato);
                if (contato == null) {
                    throw new Exception("Insira um DDD válido !!");
                }
                view.getComboUf().setSelectedItem(contato.getUf());
                view.getComboOper().setSelectedItem(contato.getOperadora());
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        }

    }

    public void btnNovoContato() {
        contatoState.novo();
    }

    public void btnFechar() {
        contatoState.fechar();
    }

    public void btnCancelar() {
        contatoState.cancelar();
    }

    public void btnEditarPessoa() throws Exception {
        this.executarFramework(view);
        contatoState.editar(usuario, contatos, contato);
    }

    public void btnSalvarPessoa() throws Exception {
        this.executarFramework(view);
        contatoState.salvar(usuario, contatos);
    }

    public void funcaoBtnSalvarEditar(boolean flag) {
        for (ActionListener listener : view.getBtnSalvar().getActionListeners()) {
            view.getBtnSalvar().removeActionListener(listener);
        }
        if (flag == true) {
            view.getBtnSalvar().addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    try {
                        btnEditarPessoa();
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(view, ex.getMessage());

                    }
                }
            });
        } else {
            view.getBtnSalvar().addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    try {
                        btnSalvarPessoa();
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(view, ex.getMessage());
                    }
                }
            });
        }
    }

    public void funcaoBtnFecharCancelar(boolean flag) {
        for (ActionListener listener : view.getBtnFechar().getActionListeners()) {
            view.getBtnFechar().removeActionListener(listener);
        }
        if (flag == true) {
            view.getBtnFechar().addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    try {
                        btnFechar();
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(view, ex.getMessage());

                    }
                }
            });
        } else {
            view.getBtnFechar().addActionListener(new java.awt.event.ActionListener() {

                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    try {
                        btnCancelar();
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(view, ex.getMessage());
                    }
                }
            });
        }
    }

    public void pegaContatoView() {
        String nome = view.getTxtNome().getText();
        String sobrenome = view.getTxtSobrenome().getText();
        Object telefone = view.getTxtTelefone().getValue();
        try {
            contato = Operadoras.getInstancia().detectaUfOperadora(new Contato(nome, sobrenome, String.valueOf(telefone), null, null));
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

    @Override
    public void confirmar() {
    }

}
